home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 February
/
EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso
/
earcd
/
comm2
/
kms20src.lha
/
KMSC
/
user.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-04-06
|
27KB
|
1,046 lines
/**********************************
* KMS *
**********************************
* ©1995 by BlackMagic Software *
**********************************
* *
**********************************/
#include <KMS/KMS.h>
#include <KMS/KMS_devlib.h>
Prototype VOID InitUser(struct Userdaten *);
Prototype struct UserNode *UserCheck(STRPTR);
Prototype struct UserNode *InsertUser(VOID);
Prototype VOID DeleteUser(struct UserNode *);
Prototype BOOL RemoveUser(STRPTR);
Prototype BOOL EditUser(STRPTR);
Prototype BOOL EditUserInfo(struct UserNode *, UWORD);
Prototype BOOL ListUsers(STRPTR);
Prototype ULONG SetAccessBits(ULONG, UWORD);
Prototype VOID GlobalUserEdit(VOID);
Prototype VOID ConvertSpace(STRPTR);
Prototype VOID Upper(STRPTR);
Prototype BOOL CreateUserDir(struct UserNode *);
Prototype VOID TakeUSem(BOOL);
Prototype VOID DropUSem(VOID);
Prototype BOOL AddUMSUser(struct UserNode *);
Prototype BOOL DelUMSUser(struct UserNode *);
/*****************************
* Externe Globale Variablen *
*****************************/
extern struct KMSBase *KMSBase;
extern struct LocalConfig *KMS_LC;
extern STRPTR PPArg;
extern UBYTE ShutDown, Plop;
extern UMSAccount SysUMSAccount;
extern struct UserNode DummyUser;
/*********************
* Globale Variablen *
*********************/
/*********************************
* Neue Userstruktur vorbereiten *
*********************************
* I: struct Userdaten * *
* O: --- *
*********************************/
/// "InitUser"
VOID InitUser(struct Userdaten *user)
{
struct UserNode *defuser;
clrmem(user, sizeof(struct Userdaten));
defuser = UserCheck("Default");
if (defuser)
*user = defuser->UserData;
else
{
user->Level = 10;
user->CharSet = 0;
user->Flags = UF_EMU_ANSI|UF_EDIT_INSERT|UF_RMODE_NEW|UF_SCREEN_ED|UF_AUTO_LIST|UF_AUTO_AREALIST|UF_PDAT_SECRET;
strcpy(user->Prompt, "[%p]> ");
user->PageLen = 25;
user->LineLen = 80;
user->Quota = 10;
}
*user->Name = '\0';
*user->RealName = '\0';
}
///
/**********************************
* Username auf Gültigkeit prüfen *
**********************************
* I: Name *
* O: struct UserNode * *
**********************************/
/// "UserCheck"
struct UserNode *UserCheck(STRPTR name)
{
struct UserNode *upoint;
if (!name || !strlen(name))
return NULL;
ConvertSpace(name);
TakeUSem(FALSE);
upoint = (struct UserNode *)KMSBase->UserList.mlh_Head;
while (upoint->Node.mln_Succ)
{
if (!stricmp(name, upoint->UserData.Name))
{
DropUSem();
return upoint;
}
upoint = upoint->Node.mln_Succ;
}
DropUSem();
return NULL;
}
///
/********************************
* User neu anlegen *
********************************
* I: --- *
* O: struct UserNode * *
********************************/
/// "InsertUser"
struct UserNode *InsertUser(VOID)
{
struct UserNode *upoint, *newupoint;
UWORD id, maxid;
upoint = (struct UserNode *)KMSBase->UserList.mlh_TailPred;
if (!upoint->Node.mln_Pred)
{
SystemError("InsertUser", "No UserList!");
return NULL;
}
maxid = 0; id = 0;
upoint = (struct UserNode *)KMSBase->UserList.mlh_Head;
while (upoint->Node.mln_Succ)
{
id = upoint->UserData.ID;
if (id > maxid)
maxid = id;
upoint = (struct UserNode *)upoint->Node.mln_Succ;
}
maxid++;
if (maxid == 0) /* Überlauf */
{
SystemError("InsertUser", "Too many users!");
return NULL;
}
if (!(newupoint = (struct UserNode *)AllocMem((ULONG)sizeof(struct UserNode), MEMF_PUBLIC|MEMF_CLEAR)))
{
SystemError("InsertUser", "Out of memory!");
return NULL;
}
newupoint->UserData.ID = maxid;
AddTail((struct List *)&KMSBase->UserList, (struct Node *)newupoint);
return newupoint;
}
///
/********************************
* Userstruktur löschen *
********************************
* I: struct UserNode * *
* O: --- *
********************************/
/// "DeleteUser"
VOID DeleteUser(struct UserNode *target)
{
if (!target)
return;
Remove((struct Node *)target);
FreeMem(target, (ULONG)sizeof(struct UserNode));
}
///
/********************************
* User löschen *
********************************
* I: STRPTR name *
* O: BOOL Erfolg ja/nein *
********************************/
/// "RemoveUser"
BOOL RemoveUser(STRPTR name)
{
TEXT buff[LEN_DOSPATH+LEN_USERNAME+18+1];
TEXT buffer[LEN_DOSPATH+1];
struct UserNode *upoint;
if (!name || !strlen(name))
return FALSE;
if (upoint = UserCheck(name))
{
/* Wenn User momentan online, nicht löschen */
TakeMSem(FALSE);
struct KMSNode *member = KMSBase->MemberList.mlh_Head;
while (member->Node.mln_Succ)
{
if (member->LCPtr->Session.CurrentUser == upoint)
{
DropMSem();
SysMsg(USER_ONLINE);
return FALSE;
}
member = member->Node.mln_Succ;
}
DropMSem();
/* Löschen */
if (YNRequest(DELETE_USER, FALSE))
{
/* User-Directory loeschen */
strcpy(buffer, KMSBase->UserDir);
strcat(buffer, upoint->UserData.Name);
ConvertSpace(buffer);
sprintf(buff, "Delete >NIL: %s/#?", buffer);
SystemCall(buff);
if (!DeleteFile(buffer))
SystemError("DeleteUser", "Error deleting user dir");
TakeUSem(TRUE);
if (!DelUMSUser(upoint))
SystemError("DeleteUser", "Error deleting UMS-User");
DeleteUser(upoint);
DropUSem();
return TRUE;
}
else
return FALSE;
}
else
{
SysMsg(USER_NOT_FOUND);
return FALSE;
}
}
///
/********************************
* User editieren/anlegen *
********************************
* I: STRPTR name *
* O: BOOL Erfolg ja/nein *
********************************/
/// "EditUser"
BOOL EditUser(STRPTR name)
{
struct UserNode *ulock;
if (name)
ConvertSpace(name);
if (name && stricmp(name, KMS_LC->Session.CurrentUser->UserData.Name))
{
/* Angegebenen User editieren bzw. neu anlegen */
if (ulock = UserCheck(name))
{
/* Editieren */
SysMsg(EDIT_OLD_USER);
if (!EditUserInfo(ulock, 0))
return FALSE;
else
return TRUE;
}
else
{
/* Neu anlegen */
TakeUSem(TRUE);
if (ulock = InsertUser())
{
DropUSem();
SysMsg(EDIT_NEW_USER);
InitUser(&ulock->UserData);
strncpy(ulock->UserData.Name, name, sizeof(ulock->UserData.Name) - 1);
if (!EditUserInfo(ulock, EU_NEW))
{
DeleteUser(ulock);
return FALSE;
}
/* UMS-User kreieren */
if (!AddUMSUser(ulock))
{
SystemError("EditUser", "Error creating UMS-User");
DeleteUser(ulock);
return FALSE;
}
/* User-Directory anlegen */
if (!CreateUserDir(ulock))
{
SystemError("EditUser", "Error creating user dir");
DelUMSUser(ulock);
DeleteUser(ulock);
return FALSE;
}
return TRUE;
}
else
{
DropUSem();
SysMsg(USERLIMIT_EXCEEDED);
return FALSE;
}
}
}
else
{
if ((ulock = KMS_LC->Session.CurrentUser) == &DummyUser)
{
SystemError("EditUser", "No CurrentUser!");
return FALSE;
}
/* Aktuellen User editieren */
SysMsg(EDIT_CURR_USER);
EditUserInfo(ulock, 0);
KMS_LC->Session.CurrentAccess = CheckAccess(KMS_LC->Session.CurrentArea);
return TRUE;
}
}
///
/********************************
* User-Info editieren *
********************************
* I: struct Userdaten *, Flag *
* O: FALSE: Timeout/ShutDown *
********************************/
/// "EditUserInfo"
BOOL EditUserInfo(struct UserNode *target, UWORD flag)
{
LONG result;
TEXT tmp[LEN_NUMBER+1];
TEXT pw[LEN_PASSWORD+1];
TEXT def[2];
BOOL currentuser = FALSE;
struct Userdaten user;
user = target->UserData;
if (!strcmp(user.Name, KMS_LC->Session.CurrentUser->UserData.Name))
currentuser = TRUE;
if (!(flag & EU_PREFS))
{
if (!(flag & EU_PWD))
{
CmdInput(NULL, PROMPT_UNAME, NULL, user.Name, sizeof(user.Name)-1, INF_PROMPT|INF_NOEMPTY|INF_DEFBUF);
if (Plop || ShutDown)
return FALSE;
strcpy(user.Name, KMS_LC->Session.InputBuffer);
ConvertSpace(user.Name);
CmdInput(NULL, PROMPT_UREALNAME, NULL, user.RealName, sizeof(user.RealName)-1, INF_PROMPT|INF_NOEMPTY|INF_DEFBUF);
if (Plop || ShutDown)
return FALSE;
strcpy(user.RealName, KMS_LC->Session.InputBuffer);
}
CmdInput(NULL, PROMPT_UPWD, NULL, NULL, LEN_PASSWORD, INF_PROMPT|INF_HIDE);
if (Plop || ShutDown)
return FALSE;
if (strlen(KMS_LC->Session.InputBuffer))
{
strcpy(pw, KMS_LC->Session.InputBuffer);
CmdInput(NULL, PROMPT_UPWD_REPEAT, NULL, NULL, LEN_PASSWORD, INF_PROMPT|INF_HIDE);
if (Plop || ShutDown)
return FALSE;
if (!strcmp(pw, KMS_LC->Session.InputBuffer))
{
if (!strcmp(pw, " "))
*pw = '\0';
/* Neues Paßwort in ums.config festhalten */
WriteUMSConfigTags(SysUMSAccount, UMSTAG_CfgUser, user.RealName,
UMSTAG_CfgName, "PASSWORD",
UMSTAG_CfgData, pw,
TAG_DONE);
if (currentuser)
strcpy(KMS_LC->Session.Password, pw);
}
else
SysMsg(PWD_NOT_CHANGED);
}
if (!(flag & EU_PWD))
{
CmdInput(NULL, PROMPT_USTREET, NULL, user.Street, sizeof(user.Street)-1, INF_PROMPT|INF_NOEMPTY|INF_DEFBUF);
if (Plop || ShutDown)
return FALSE;
strcpy(user.Street, KMS_LC->Session.InputBuffer);
CmdInput(NULL, PROMPT_UCITY, NULL, user.City, sizeof(user.City)-1, INF_PROMPT|INF_NOEMPTY|INF_DEFBUF);
if (Plop || ShutDown)
return FALSE;
strcpy(user.City, KMS_LC->Session.InputBuffer);
CmdInput(NULL, PROMPT_UPHONE, NULL, user.Phone, sizeof(user.Phone)-1, INF_PROMPT|INF_NOEMPTY|INF_DEFBUF);
if (Plop || ShutDown)
return FALSE;
strcpy(user.Phone, KMS_LC->Session.InputBuffer);
sprintf(tmp, "%d", user.Level);
result = CmdInput(NULL, PROMPT_ULEVEL, NULL, tmp, 3, INF_PROMPT|INF_NUMERIC);
if (Plop || ShutDown)
return FALSE;
user.Level = (UWORD)result;
user.AccessBits = SetAccessBits(user.AccessBits, PROMPT_UBITS);
if (Plop || ShutDown)
return FALSE;
}
}
if (!(flag & EU_PWD))
{
sprintf(tmp, "%d", user.CharSet);
result = CmdInput(NULL, PROMPT_UCHARSET, "0123456789", tmp, 1, INF_PROMPT|INF_NUMERIC);
if (Plop || ShutDown)
return FALSE;
user.CharSet = (UWORD)result;
if (user.Flags & UF_EMU_ANSI)
strcpy(def, KMSBase->Yes);
else
strcpy(def, KMSBase->No);
CmdInput(NULL, PROMPT_UANSI, KMSBase->YNText, def, 1, INF_PROMPT|INF_UPCASE);
if (Plop || ShutDown)
return FALSE;
if (*KMS_LC->Session.InputBuffer == KMSBase->YNText[YES])
user.Flags |= UF_EMU_ANSI;
else
user.Flags &= ~UF_EMU_ANSI;
if (user.Flags & UF_CLS)
strcpy(def, KMSBase->Yes);
else
strcpy(def, KMSBase->No);
CmdInput(NULL, PROMPT_UCLS, KMSBase->YNText, def, 1, INF_PROMPT|INF_UPCASE);
if (Plop || ShutDown)
return FALSE;
if (*KMS_LC->Session.InputBuffer == KMSBase->YNText[YES])
user.Flags |= UF_CLS;
else
user.Flags &= ~UF_CLS;
if (user.Flags & UF_HEAD_LONG)
strcpy(def, KMSBase->Yes);
else
strcpy(def, KMSBase->No);
CmdInput(NULL, PROMPT_UHLONG, KMSBase->YNText, def, 1, INF_PROMPT|INF_UPCASE);
if (Plop || ShutDown)
return FALSE;
if (*KMS_LC->Session.InputBuffer == KMSBase->YNText[YES])
user.Flags |= UF_HEAD_LONG;
else
user.Flags &= ~UF_HEAD_LONG;
if (user.Flags & UF_EDIT_INSERT)
strcpy(def, KMSBase->Yes);
else
strcpy(def, KMSBase->No);
CmdInput(NULL, PROMPT_UEDITINS, KMSBase->YNText, def, 1, INF_PROMPT|INF_UPCASE);
if (Plop || ShutDown)
return FALSE;
if (*KMS_LC->Session.InputBuffer == KMSBase->YNText[YES])
user.Flags |= UF_EDIT_INSERT;
else
user.Flags &= ~UF_EDIT_INSERT;
if (user.Flags & UF_AUTO_LIST)
strcpy(def, KMSBase->Yes);
else
strcpy(def, KMSBase->No);
CmdInput(NULL, PROMPT_UAUTOLIST, KMSBase->YNText, def, 1, INF_PROMPT|INF_UPCASE);
if (Plop || ShutDown)
return FALSE;
if (*KMS_LC->Session.InputBuffer == KMSBase->YNText[YES])
user.Flags |= UF_AUTO_LIST;
else
user.Flags &= ~UF_AUTO_LIST;
if (user.Flags & UF_AUTO_AREALIST)
strcpy(def, KMSBase->Yes);
else
strcpy(def, KMSBase->No);
CmdInput(NULL, PROMPT_UAUTOAREALIST, KMSBase->YNText, def, 1, INF_PROMPT|INF_UPCASE);
if (Plop || ShutDown)
return FALSE;
if (*KMS_LC->Session.InputBuffer == KMSBase->YNText[YES])
user.Flags |= UF_AUTO_AREALIST;
else
user.Flags &= ~UF_AUTO_AREALIST;
if (user.Flags & UF_PDAT_SECRET)
strcpy(def, KMSBase->Yes);
else
strcpy(def, KMSBase->No);
CmdInput(NULL, PROMPT_PDATSECRET, KMSBase->YNText, def, 1, INF_PROMPT|INF_UPCASE);
if (Plop || ShutDown)
return FALSE;
if (*KMS_LC->Session.InputBuffer == KMSBase->YNText[YES])
user.Flags |= UF_PDAT_SECRET;
else
user.Flags &= ~UF_PDAT_SECRET;
result = 1;
if (user.Flags & UF_RMODE_NEW)
result = 2;
else if (user.Flags & UF_RMODE_SEL)
result = 3;
else if (user.Flags & UF_RMODE_THRD)
result = 4;
sprintf(tmp, "%d", result);
result = CmdInput(NULL, PROMPT_URMODE, NULL, tmp, 1, INF_PROMPT|INF_NUMERIC);
if (Plop || ShutDown)
return FALSE;
user.Flags &= ~(UF_RMODE_NEW|UF_RMODE_SEL|UF_RMODE_THRD);
if (result == 2)
user.Flags |= UF_RMODE_NEW;
else if (result == 3)
user.Flags |= UF_RMODE_SEL;
else if (result == 4)
user.Flags |= UF_RMODE_THRD;
if (user.Flags & UF_SCREEN_ED)
strcpy(def, KMSBase->Yes);
else
strcpy(def, KMSBase->No);
CmdInput(NULL, PROMPT_USCREENED, KMSBase->YNText, def, 1, INF_PROMPT|INF_UPCASE);
if (Plop || ShutDown)
return FALSE;
if (*KMS_LC->Session.InputBuffer == KMSBase->YNText[YES])
user.Flags |= UF_SCREEN_ED;
else
user.Flags &= ~UF_SCREEN_ED;
CmdInput(NULL, PROMPT_UPROMPT, NULL, user.Prompt, sizeof(user.Prompt)-1, INF_PROMPT|INF_NOEMPTY|INF_DEFBUF);
if (Plop || ShutDown)
return FALSE;
strcpy(user.Prompt, KMS_LC->Session.InputBuffer);
if (!(flag & EU_PREFS))
{
sprintf(tmp, "%d", user.Quota);
result = CmdInput(NULL, PROMPT_UQUOTA, NULL, tmp, 3, INF_PROMPT|INF_NUMERIC);
if (Plop || ShutDown)
return FALSE;
user.Quota = (UWORD)result;
}
sprintf(tmp, "%d", user.PageLen);
result = CmdInput(NULL, PROMPT_UPAGELEN, NULL, tmp, 3, INF_PROMPT|INF_NUMERIC);
if (Plop || ShutDown)
return FALSE;
if (result > 9 && result < 256)
user.PageLen = (UBYTE)result;
sprintf(tmp, "%d", user.LineLen);
result = CmdInput(NULL, PROMPT_ULINELEN, NULL, tmp, 3, INF_PROMPT|INF_NUMERIC);
if (Plop || ShutDown)
return FALSE;
if (result <= LEN_MAXLINE && result > 39)
user.LineLen = (UBYTE)result;
CmdInput(NULL, PROMPT_UPROT, KMSBase->YNText, KMSBase->No, 1, INF_PROMPT|INF_UPCASE);
if (Plop || ShutDown)
return FALSE;
if (*KMS_LC->Session.InputBuffer == KMSBase->YNText[YES])
ProtSelect(FALSE);
}
Forbid();
target->UserData = user;
Permit();
return TRUE;
}
///
/********************************
* Userliste *
********************************
* I: --- *
* O: OK/Fehler *
********************************/
/// "ListUsers"
BOOL ListUsers(STRPTR name)
{
TEXT timebuff[LEN_MAKETIME+1];
TEXT buff[LEN_MAKETIME+57+1];
struct UserNode *upoint;
UWORD id = 0;
UBYTE abbruch = 0;
SysMsg(USERLST_HEAD);
ConvertSpace(name);
KMS_LC->Session.LineCounter = 6;
TakeUSem(FALSE);
upoint = (struct UserNode *)KMSBase->UserList.mlh_Head;
while (upoint->Node.mln_Succ && !abbruch)
{
if (stricmp(upoint->UserData.Name, "Default"))
{
id++;
if (!name || !stricmp(upoint->UserData.Name, name))
{
if (upoint->UserData.LastCall)
MakeTime(timebuff, 0, upoint->UserData.LastCall);
else
strcpy(timebuff, "--------/--------");
if (upoint->UserData.Flags & UF_PDAT_SECRET)
sprintf(buff, "%4d %-25.25s\n", id, upoint->UserData.Name);
else
sprintf(buff, "%4d %-25.25s %-25.25s %s\n", id, upoint->UserData.Name, upoint->UserData.City, timebuff);
abbruch = MsgPrint(buff, 0);
}
}
upoint = upoint->Node.mln_Succ;
}
DropUSem();
return TRUE;
}
///
/****************************************
* Zugriffsbits setzen *
****************************************
* I: Alter AccessBits-Wert, Prompt-Nr. *
* O: Neuer AccessBits-Wert *
****************************************/
/// "SetAccessBits"
ULONG SetAccessBits(ULONG accbits, UWORD prompt)
{
TEXT accstring[32*LEN_ACCBITNAME+32+1];
TEXT bitbuff[LEN_NUMBER+1];
STRPTR arg;
ULONG acc;
UBYTE n;
BOOL repeat = TRUE;
while (repeat)
{
repeat = FALSE;
*accstring = '\0';
acc = accbits;
n = 0;
while (acc)
{
if (acc & 1)
{
if (strlen(KMSBase->AccBitNames[n]))
strcat(accstring, KMSBase->AccBitNames[n]);
else
{
sprintf(bitbuff, "%d", n+1);
strcat(accstring, bitbuff);
}
strcat(accstring, "+");
}
acc = acc / 2;
n++;
}
if (strlen(accstring))
accstring[strlen(accstring)-1] = '\0';
CmdInput(NULL, prompt, NULL, accstring, LEN_CMDINPUT, INF_PROMPT|INF_DEFBUF);
if (Plop || ShutDown)
return accbits;
acc = 0;
for(arg = strtok(KMS_LC->Session.InputBuffer, " +"); arg; arg = strtok(NULL, " +"))
{
if (atoi(arg))
{
if (atoi(arg) < 33)
acc |= (1L<<(atoi(arg)-1));
else
{
PPArg = arg;
SysMsg(INVALID_ACCBITNUM);
PPArg = NULL;
repeat = TRUE;
}
}
else
{
for(n = 0; n < 32; n++)
{
if (!stricmp(arg, KMSBase->AccBitNames[n]))
{
acc |= (1L<<n);
break;
}
}
if (n == 32)
{
PPArg = arg;
SysMsg(UNDEFINED_ACCBITNAME);
PPArg = NULL;
repeat = TRUE;
}
}
}
accbits = acc;
}
return accbits;
}
///
/********************************
* Alle User edieren *
********************************
* I: --- *
* O: --- *
********************************/
/// "GlobalUserEdit"
VOID GlobalUserEdit(VOID)
{
TEXT timebuff[LEN_MAKETIME+1];
TEXT buff[LEN_MAKETIME+57+1];
struct UserNode *upoint;
ULONG addbits;
ULONG delbits;
UWORD id = 0;
addbits = SetAccessBits(0, PROMPT_UADDBITS);
if (Plop || ShutDown)
return;
delbits = SetAccessBits(0, PROMPT_UDELBITS);
if (Plop || ShutDown)
return;
if (!addbits && !delbits)
return;
SysMsg(USERLST_HEAD);
KMS_LC->Session.LineCounter = 6;
TakeUSem(FALSE);
upoint = (struct UserNode *)KMSBase->UserList.mlh_Head;
while (upoint->Node.mln_Succ)
{
id++;
if (upoint->UserData.LastCall)
{
MakeTime(timebuff, 0, upoint->UserData.LastCall);
sprintf(buff, "%4d %-25.25s %-25.25s %s\n", id, upoint->UserData.Name, upoint->UserData.City, timebuff);
}
else
sprintf(buff, "%4d %-25.25s %-25.25s --------/--------\n", id, upoint->UserData.Name, upoint->UserData.City);
MsgPrint(buff, 0);
if (addbits)
upoint->UserData.AccessBits |= addbits;
if (delbits)
upoint->UserData.AccessBits &= ~delbits;
upoint = upoint->Node.mln_Succ;
}
DropUSem();
}
///
/********************************
* Leerzeichen -> Underscore *
********************************
* I: STRPTR *
* O: --- *
********************************/
/// "ConvertSpace"
VOID ConvertSpace(STRPTR string)
{
if (!string)
return;
while (*string)
{
if (*string == ' ')
*string = '_';
string++;
}
}
///
/********************************
* String -> Großbuchstaben *
********************************
* I: STRPTR *
* O: --- *
********************************/
/// "Upper"
VOID Upper(STRPTR string)
{
if (!string)
return;
while (*string)
{
*string = toupper(*string);
string++;
}
}
///
/********************************
* Userdir anlegen *
********************************
* I: struct UserNode * *
* O: OK TRUE/FALSE *
********************************/
/// "CreateUserDir"
BOOL CreateUserDir(struct UserNode *ulock)
{
BPTR lock;
TEXT buff1[LEN_DOSPATH+1];
TEXT buff2[LEN_DOSPATH+1];
TEXT buff3[LEN_MAXLINE+1];
strcpy(buff1, KMSBase->UserDir);
strcat(buff1, ulock->UserData.Name);
ConvertSpace(buff1);
if (lock = CreateDir(buff1))
{
UnLock(lock);
if (UserCheck("Default"))
{
strcpy(buff2, KMSBase->UserDir);
strcat(buff2, "Default");
ConvertSpace(buff2);
sprintf(buff3, "Copy >NIL: %s %s", buff2, buff1);
SystemCall(buff3);
}
else
{
/* LOGIN.COM kopieren */
sprintf(buff2, "%sLOGIN.COM", KMSBase->UserDir);
strcat(buff1, "/LOGIN.COM");
Copy(buff2, buff1, FALSE);
}
return TRUE;
}
else
return FALSE;
}
///
/********************************
* Usersemaphore reservieren *
********************************
* I: BOOL exclusive *
* O: --- *
********************************/
/// "TakeUSem"
VOID TakeUSem(BOOL exclusive)
{
if (exclusive)
ObtainSemaphore(&KMSBase->UserSem);
else
ObtainSemaphoreShared(&KMSBase->UserSem);
}
///
/********************************
* Usersemaphore freigeben *
********************************
* I: --- *
* O: --- *
********************************/
/// "DropUSem"
VOID DropUSem(VOID)
{
ReleaseSemaphore(&KMSBase->UserSem);
}
///
/********************************
* UMS-Usereintrag erzeugen *
********************************
* I: struct UserNode * *
* O: Erfolg TRUE/FALSE *
********************************/
/// AddUMSUser
BOOL AddUMSUser(struct UserNode *unode)
{
if (!WriteUMSConfigTags(SysUMSAccount, UMSTAG_CfgCreateUser, unode->UserData.RealName,
TAG_DONE))
return FALSE;
if (WriteUMSConfigTags(SysUMSAccount, UMSTAG_CfgUser, unode->UserData.RealName,
UMSTAG_CfgCreateAlias, unode->UserData.Name,
TAG_DONE))
if (WriteUMSConfigTags(SysUMSAccount, UMSTAG_CfgUser, unode->UserData.RealName,
UMSTAG_CfgName, "READACCESS",
UMSTAG_CfgData, "#?",
TAG_DONE))
if (WriteUMSConfigTags(SysUMSAccount, UMSTAG_CfgUser, unode->UserData.RealName,
UMSTAG_CfgName, "WRITEACCESS",
UMSTAG_CfgData, "#?",
TAG_DONE))
if (WriteUMSConfigTags(SysUMSAccount, UMSTAG_CfgUser, unode->UserData.RealName,
UMSTAG_CfgName, "NETACCESS",
UMSTAG_CfgData, "#?",
TAG_DONE))
return TRUE;
WriteUMSConfigTags(SysUMSAccount, UMSTAG_CfgDeleteUser, unode->UserData.RealName,
TAG_DONE);
return FALSE;
}
///
/********************************
* UMS-Usereintrag löschen *
********************************
* I: struct UserNode * *
* O: Erfolg TRUE/FALSE *
********************************/
/// DelUMSUser
BOOL DelUMSUser(struct UserNode *unode)
{
if (!WriteUMSConfigTags(SysUMSAccount, UMSTAG_CfgDeleteUser, unode->UserData.RealName,
TAG_DONE))
return FALSE;
}
///